<template>
  <view class="content">
    <view class="navbar" :style="{ position: headerPosition, top: headerTop }">
      <view
        class="nav-item"
        :class="{ current: filterIndex === 0 }"
        @click="tabClick(0)"
      >
        综合排序
      </view>
      <view
        class="nav-item"
        :class="{ current: filterIndex === 1 }"
        @click="tabClick(1)"
      >
        销量优先
      </view>
      <view
        class="nav-item"
        :class="{ current: filterIndex === 2 }"
        @click="tabClick(2)"
      >
        <text>价格</text>
        <view class="p-box">
          <text
            :class="{ active: priceOrder === 1 && filterIndex === 2 }"
            class="yticon icon-shang"
          ></text>
          <text
            :class="{ active: priceOrder === 2 && filterIndex === 2 }"
            class="yticon icon-shang xia"
          ></text>
        </view>
      </view>
      <text
        class="cate-item yticon icon-fenlei1"
        @click="toggleCateMask('show')"
      ></text>
    </view>
    <!-- 空白页 -->
    <empty v-if="goodsList.length == 0"></empty>
    <view v-if="goodsList.length > 0">
      <view class="goods-list">
        <view
          v-for="(item, index) in goodsList"
          :key="index"
          class="goods-item"
          @click="navToDetailPage(item)"
        >
          <view class="image-wrapper">
            <image :src="item.main_image" mode="aspectFill"></image>
          </view>
          <text class="title clamp">{{ item.name }}</text>
          <view class="price-box">
            <text class="price">{{ item.min_price }}</text>
            <text>已售 {{ item.sales }}</text>
          </view>
        </view>
      </view>
      <uni-load-more :status="more"></uni-load-more>
    </view>
    <view
      class="cate-mask"
      :class="cateMaskState === 0 ? 'none' : cateMaskState === 1 ? 'show' : ''"
      @click="toggleCateMask"
    >
      <view
        class="cate-content"
        @click.stop.prevent="stopPrevent"
        @touchmove.stop.prevent="stopPrevent"
      >
        <uni-section title="商品标签" type="line" padding>
          <view class="tag-list">
            <view
              class="tag-view"
              v-for="(item, index) in tagList"
              :key="index"
            >
              <uni-tag
                :inverted="true"
                :class="tag_ids.includes(item.id) ? 'selected-tag' : ''"
                :text="item.name"
                @click="tagSelect(item.id)"
              />
            </view>
          </view>
        </uni-section>
        <uni-section title="商品品牌" type="line" padding>
          <view class="tag-list">
            <view
              class="tag-view"
              v-for="(item, index) in brandList"
              :key="index"
            >
              <uni-tag
                :inverted="true"
                :class="brand_id == item.id ? 'selected-tag' : ''"
                :text="item.name"
                @click="brandSelect(item.id)"
              />
            </view>
          </view>
        </uni-section>
      </view>
    </view>
  </view>
</template>

<script>
import empty from "@/components/empty";
export default {
  components: {
    empty,
  },
  data() {
    return {
      cateMaskState: 0, //分类面板展开状态
      headerPosition: "fixed",
      headerTop: "0px",
      sortfield: "comprehensive",
      order: "",
      filterIndex: 0,
      cateId: 0, //已选三级分类id
      priceOrder: 0, //1 价格从低到高 2价格从高到低
      cateList: [],
      goodsList: [],
      options: [],
      tag_ids: [],
      tagList: [],
      brandList: [],
      brand_id: 0,
      triggered: false,
      has_more: true,
      more: "more",
      page: 1,
    };
  },
  onPageScroll(e) {
    //兼容iOS端下拉时顶部漂移
    if (e.scrollTop >= 0) {
      this.headerPosition = "fixed";
    } else {
      this.headerPosition = "absolute";
    }
  },
  async onPullDownRefresh() {
    this.page = 1;
    await this.loadData();
    // 数据更新后，停止下拉刷新动画，关闭下拉刷新
    uni.stopPullDownRefresh();
  },
  async onReachBottom() {
    if (this.has_more) {
      this.page++;
      await this.loadData();
    }
  },
  async onLoad(options) {
    // #ifdef H5
    this.$nextTick(() => {
      this.headerTop =
        document.getElementsByTagName("uni-page-head")[0].offsetHeight + "px";
    });
    // #endif

    this.options = options;
    Promise.all([
      this.$http.goods.goodsBrandList(),
      this.$http.goods.goodsTagList(),
    ]).then((r) => {
      this.brandList = r[0].data;
      this.tagList = r[1].data;
    });

    await this.loadData();
  },
  methods: {
    async loadData() {
      let { data } = await this.$http.goods.goodsSearchPage({
        ...this.options,
        ...{
          pageNo: this.page,
          sortfield: this.sortfield,
          order: this.order,
          tag_ids: this.tag_ids,
          brand_id: this.brand_id,
        },
      });
      this.goodsList = [...this.goodsList, ...data.records];
      this.has_more = data.has_more;
      if (!this.has_more) {
        this.more = "noMore";
      }
    },
    async refresh() {
      if (!this.triggered) {
        this.triggered = true;
        setTimeout(async () => {
          this.page = 1;
          this.goodsList = [];
          await this.loadData();
          this.triggered = false;
        }, 500);
      }
    },
    lowerData() {
      if (!this.has_more) {
        return;
      }
      setTimeout(async () => {
        this.page++;
        await this.loadData();
        this.triggered = false;
      }, 500);
    },
    //筛选点击
    tabClick(index) {
      this.sortfield = "";
      this.order = "";
      if (this.filterIndex === index && index !== 2) {
        return;
      }
      this.filterIndex = index;
      if (index === 2) {
        this.priceOrder = this.priceOrder === 1 ? 2 : 1;
        this.sortfield = "price";
        this.order = this.priceOrder === 2 ? "desc" : "asc";
      } else {
        this.priceOrder = 0;
      }
      //综合排序
      if (index == 0) {
        this.sortfield = "comprehensive";
        this.order = "";
      }
      //销量优先
      if (index == 1) {
        this.sortfield = "sales";
        this.order = "desc";
      }
      this.pageNo = 1;
      this.goodsList = [];
      this.loadData();
    },
    toggleCateMask(type) {
      let timer = type === "show" ? 10 : 300;
      let state = type === "show" ? 1 : 0;
      this.cateMaskState = 2;
      setTimeout(() => {
        this.cateMaskState = state;
      }, timer);
    },
    changeCate(item) {
      this.toggleCateMask();
      this.loadData();
    },
    //详情
    navToDetailPage(item) {
      uni.navigateTo({
        url: `/pages/product/product?id=${item.id}`,
      });
    },
    stopPrevent() {},
    tagSelect(id) {
      const idx = this.tag_ids.findIndex((r) => r == id);
      if (idx === -1) {
        this.tag_ids.push(id);
      } else {
        this.tag_ids.splice(idx, 1);
      }

      this.pageNo = 1;
      this.goodsList = [];
      this.loadData();
    },
    brandSelect(id) {
      if (this.brand_id == id) {
        this.brand_id = 0;
      } else {
        this.brand_id = id;
      }

      this.pageNo = 1;
      this.goodsList = [];
      this.loadData();
    },
  },
};
</script>

<style lang="scss">
page,
.content {
  background: $page-color-base;
}

.content {
  padding-top: 96upx;
}

.navbar {
  position: fixed;
  left: 0;
  top: var(--window-top);
  display: flex;
  width: 100%;
  height: 80upx;
  background: #fff;
  box-shadow: 0 2upx 10upx rgba(0, 0, 0, 0.06);
  z-index: 10;

  .nav-item {
    flex: 1;
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100%;
    font-size: 30upx;
    color: $font-color-dark;
    position: relative;

    &.current {
      color: $base-color;

      &:after {
        content: "";
        position: absolute;
        left: 50%;
        bottom: 0;
        transform: translateX(-50%);
        width: 120upx;
        height: 0;
        border-bottom: 4upx solid $base-color;
      }
    }
  }

  .p-box {
    display: flex;
    flex-direction: column;

    .yticon {
      display: flex;
      align-items: center;
      justify-content: center;
      width: 30upx;
      height: 14upx;
      line-height: 1;
      margin-left: 4upx;
      font-size: 26upx;
      color: #888;

      &.active {
        color: $base-color;
      }
    }

    .xia {
      transform: scaleY(-1);
    }
  }

  .cate-item {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100%;
    width: 80upx;
    position: relative;
    font-size: 44upx;

    &:after {
      content: "";
      position: absolute;
      left: 0;
      top: 50%;
      transform: translateY(-50%);
      border-left: 1px solid #ddd;
      width: 0;
      height: 36upx;
    }
  }
}

/* 分类 */
.cate-mask {
  position: fixed;
  left: 0;
  top: var(--window-top);
  bottom: 0;
  width: 100%;
  background: rgba(0, 0, 0, 0);
  z-index: 95;
  transition: 0.3s;

  .cate-content {
    width: 630upx;
    height: 100%;
    background: #fff;
    float: right;
    transform: translateX(100%);
    transition: 0.3s;
  }

  &.none {
    display: none;
  }

  &.show {
    background: rgba(0, 0, 0, 0.4);

    .cate-content {
      transform: translateX(0);
    }
  }
}

.cate-list {
  display: flex;
  flex-direction: column;
  height: 100%;

  .cate-item {
    display: flex;
    align-items: center;
    height: 90upx;
    padding-left: 30upx;
    font-size: 28upx;
    color: #555;
    position: relative;
  }

  .two {
    height: 64upx;
    color: #303133;
    font-size: 30upx;
    background: #f8f8f8;
  }

  .active {
    color: $base-color;
  }
}

/* 商品列表 */
.goods-list {
  display: flex;
  flex-wrap: wrap;
  padding: 0 30upx;
  background: #fff;

  .goods-item {
    display: flex;
    flex-direction: column;
    width: 48%;
    padding-bottom: 40upx;

    &:nth-child(2n + 1) {
      margin-right: 4%;
    }
  }

  .image-wrapper {
    width: 100%;
    height: 330upx;
    border-radius: 3px;
    overflow: hidden;

    image {
      width: 100%;
      height: 100%;
      opacity: 1;
    }
  }

  .title {
    font-size: $font-lg;
    color: $font-color-dark;
    line-height: 80upx;
  }

  .price-box {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding-right: 10upx;
    font-size: 24upx;
    color: $font-color-light;
  }

  .price {
    font-size: $font-lg;
    color: $uni-color-primary;
    line-height: 1;

    &:before {
      content: "￥";
      font-size: 26upx;
    }
  }
}

.list-scroll-content {
  height: 100%;
}
.tag-list {
  display: flex;
  flex-wrap: wrap;
}
.tag-view {
  margin: 5rpx 15rpx 30rpx 15rpx;
}
.selected-tag {
  background-color: #d30b0b; /* 背景色 */
  color: #fff; /* 文字颜色 */
  border-color: #d30b0b; /* 边框颜色 */
}
</style>
